package org.japo.java.swing.igu;

import java.awt.Dimension;
import java.awt.Font;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.Arrays;
import java.util.StringTokenizer;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import org.japo.java.swing.listeners.GEA;
import org.japo.java.swing.listeners.GET;

public class IGU extends JFrame {

    private JTextField txfUser;
    private JPasswordField psfPass;
    private JButton btnAceptar;

    private final String FICHERO = "passwords.txt";

    public IGU() {
        iniciarComponentes();
    }

    private void iniciarComponentes() {
        //Panel principal
        JPanel pnlPrincipal = new JPanel();
        pnlPrincipal.setLayout(null);

        //Fuente de las etiquetas
        Font f = new Font("Calibri", Font.BOLD + Font.ITALIC, 16);

        //Gestor de eventos de acción
        GEA gea = new GEA(this);

        //Gestor de eventos de teclado
        GET get = new GET(this);

        //Tamaños de controles
        Dimension dLabel = new Dimension(80, 30);
        Dimension dField = new Dimension(120, 30);
        Dimension dBoton = new Dimension(100, 30);

        //Etiqueta de usuario
        JLabel lblUser = new JLabel();
        lblUser.setFont(f);
        lblUser.setText("Usuario");
        lblUser.setSize(dLabel);
        lblUser.setLocation(35, 35);
        lblUser.setHorizontalAlignment(JLabel.RIGHT);
        pnlPrincipal.add(lblUser);

        //Etiqueta de password
        JLabel lblPass = new JLabel();
        lblPass.setFont(f);
        lblPass.setText("Contraseña");
        lblPass.setSize(dLabel);
        lblPass.setLocation(35,85);
        lblPass.setHorizontalAlignment(JLabel.RIGHT);
        pnlPrincipal.add(lblPass);
        
        //Campo de texto de user
        txfUser = new JTextField();
        lblUser.setText("");
        txfUser.setSize(dField);
        txfUser.setLocation(130, 35);
        txfUser.addActionListener(gea);
        pnlPrincipal.add(txfUser);
        

        //Campo de texto de password
        psfPass = new JPasswordField();
        psfPass.setText("");
        psfPass.setSize(dField);
        psfPass.setLocation(130, 85);
        psfPass.addActionListener(gea);
        pnlPrincipal.add(psfPass);

        //Botón de aceptar
        btnAceptar = new JButton();
        btnAceptar.setText("Aceptar");
        btnAceptar.setSize(dBoton);
        btnAceptar.setLocation(30, 145);
        btnAceptar.addActionListener(gea);
        btnAceptar.addKeyListener(get);
        pnlPrincipal.add(btnAceptar);

        //Botón de cancelar
        JButton btnCancelar = new JButton();
        btnCancelar.setText("Cancelar");
        btnCancelar.setSize(dBoton);
        btnCancelar.setLocation(150, 145);
        btnCancelar.addActionListener(gea);
        btnCancelar.addKeyListener(get);
        pnlPrincipal.add(btnCancelar);

        //Ventana principal
        setContentPane(pnlPrincipal);
        setTitle("Login");
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(290, 240);
        setLocationRelativeTo(null);

    }

    private boolean validarUsuario(String userAct, char[] passAct) {
        //Semáforo de user/pass encontrado
        boolean usuarioOK = false;

        try {
            //Acceso al archivo físico - Char
            FileReader fr = new FileReader(FICHERO);

            //Acceso al archivo físico - String
            BufferedReader br = new BufferedReader(fr);

            //Semáforo proceso lectura
            boolean finProcesoOK = false;
            do {
                //Leer línea actual
                String lineaActual = br.readLine();

                //Analizar línea actual
                if (lineaActual != null) {
                    //Objeto extractor
                    StringTokenizer st = new StringTokenizer(lineaActual, ",");

                    //Extraer user/pass
                    String userRef = st.nextToken();
                    char[] passRef = st.nextToken().toCharArray();

                    //Analizar user/pass
                    if (userAct.equals(userRef) && Arrays.equals(passAct, passRef)) {
                        //Usuario encontrado
                        usuarioOK = true;
                        finProcesoOK = true;

                    }
                } else {
                    //Final del fichero
                    finProcesoOK = true;
                }
            } while (!finProcesoOK);
        } catch (Exception e) {
            //Error en el acceso al fichero
            System.out.println("Error: " + e);
        }

        //Semáforo de usuario validado
        return usuarioOK;
    }

    public void procesarAccion(Object o) {
        if (o.equals(txfUser)) {    //Campo de texto
            //Enfoca el campo de password
            psfPass.requestFocus();
        } else if (o.equals(psfPass)) {
            //Enfoca el botón de aceptar
            btnAceptar.requestFocus();
            procesarAcceso();
        } else {
            JOptionPane.showMessageDialog(this, "Proceso cancelado");
        }
    }

    private void procesarAcceso() {
        String userAct = txfUser.getText();
        char[]passAct = psfPass.getPassword();
        
        if (validarUsuario(userAct,passAct)) {
            JOptionPane.showMessageDialog(this, "Acceso permitido");
        } else {
            JOptionPane.showMessageDialog(this, "Acceso denegado");
        }
    }

}
